/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package analiseSintatica.Regras.Blocos;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSemantica.Tipos.TiposSemanticos;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Comandos.RegraInstrucao;
import analiseSintatica.Regras.Regra;
import java.util.LinkedList;

/**
 *
 * @author Dede do Bem
 */
public class RegraCorpoFuncao extends Regra {


    protected static Regra instancia;

    protected String estrutura = "'{' {<instrucao>} '}'";
    
    /**
     * Construtor privado necessario ao singleton
     */
    private RegraCorpoFuncao(){

    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraCorpoFuncao getInstance() {
        if (instancia == null) {
            instancia = new RegraCorpoFuncao();
        }
        return (RegraCorpoFuncao) instancia;

    }


    @Override
    public TiposSemanticos analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
        
		TiposSemanticos tiposemanticos = new TiposSemanticos();
    	
    	reconheceLexema(listaTokens, "delimitador", "{", estrutura);
    	while (listaContem(RegraInstrucao.getInstance().getPrimeiro(), listaTokens.getFirst())){
    		TiposSemanticos temp = RegraInstrucao.getInstance().analisar(listaTokens);
    		while ((temp != null) && (temp.size() != 0)){
    			tiposemanticos.addTipos(temp.removeTipos());
    		}
    	}
    	reconheceLexema(listaTokens, "delimitador", "}", estrutura);
        return tiposemanticos;
    }

    @Override
    protected void setPrimeiro() {
        this.primeiro.add("{");
    }

    


}
